// api_provider.dart
import 'package:flutter/foundation.dart';
import 'package:provider_student/models/recommend_user.dart'; // 确保路径正确
import '../services/http_service.dart'; // 导入 HttpService
import '../models/api_response.dart'; // 导入 ApiResponse

/// API提供者，用于管理网络请求状态
class ApiProvider with ChangeNotifier {
  final HttpService _httpService; // <--- 声明为 final，通过构造函数注入

  bool _isLoading = false;
  String? _errorMessage;

  // 构造函数：现在要求传入一个 HttpService 实例
  ApiProvider({required HttpService httpService}) : _httpService = httpService;

  // Getters
  bool get isLoading => _isLoading;
  String? get errorMessage => _errorMessage;

  // 设置加载状态
  void _setLoading(bool loading) {
    _isLoading = loading;
    notifyListeners();
  }

  // 设置错误信息
  void _setError(String? error) {
    _errorMessage = error;
    notifyListeners();
  }

  // 清除错误信息
  void clearError() {
    _errorMessage = null;
    notifyListeners();
  }

  // 设置访问令牌
  void setAccessToken(String token) {
    _httpService.setAccessToken(token);
  }

  // 清除访问令牌
  void clearAccessToken() {
    _httpService.clearAccessToken();
  }

  /// 执行GET请求
  Future<ApiResponse<T>> get<T>(
    String endpoint, {
    Map<String, dynamic>? queryParameters,
    T? Function(dynamic)? fromJson,
    bool showLoading = true,
    bool needDecrypt = true,
  }) async {
    if (showLoading) _setLoading(true);
    _setError(null);

    try {
      final response = await _httpService.get<T>(
        endpoint,
        queryParameters: queryParameters,
        fromJson: fromJson,
        needDecrypt: needDecrypt,
      );

      if (!response.success) {
        // 使用 HttpService 返回的 message，更具体
        _setError(response.message);
      }

      return response;
    } catch (e) {
      // 这里的 catch 主要是捕获 HttpService 之外的异常 (例如，网络连接完全断开，Dio 都没机会处理的异常)
      // 但通常情况下，DioException 会在 HttpService 内部被捕获和处理，并返回 ApiResponse.failure
      // 所以这个 catch 块可能很少被触发，但作为最后的防线是好的。
      final errorMsg = '请求失败: ${e.toString()}';
      _setError(errorMsg);
      // 返回一个失败的 ApiResponse，使用 HttpService 内部处理后的错误信息
      return ApiResponse.failure<T>(message: errorMsg);
    } finally {
      if (showLoading) _setLoading(false);
    }
  }

  /// 执行POST请求
  Future<ApiResponse<T>> post<T>(
    String endpoint, {
    dynamic data,
    Map<String, dynamic>? queryParameters,
    T? Function(dynamic)? fromJson,
    bool showLoading = true,
    bool needDecrypt = true,
  }) async {
    if (showLoading) _setLoading(true);
    _setError(null);

    try {
      final response = await _httpService.post<T>(
        endpoint,
        data: data,
        queryParameters: queryParameters,
        fromJson: fromJson,
        needDecrypt: needDecrypt,
      );

      if (!response.success) {
        // 使用 HttpService 返回的 message，更具体
        _setError(response.message);
      }

      return response;
    } catch (e) {
      final errorMsg = '请求失败: ${e.toString()}';
      _setError(errorMsg);
      // 返回一个失败的 ApiResponse，使用 HttpService 内部处理后的错误信息
      return ApiResponse.failure<T>(message: errorMsg);
    } finally {
      if (showLoading) _setLoading(false);
    }
  }

  /// 获取推荐用户列表，现在返回 RecommendUserListResponse
  Future<ApiResponse<RecommendUserListResponse>> getRecommendUserList({
    int page = 1,
    int pageSize = 10,
    bool showLoading = true,
  }) async {
    final queryParams = {'page': page, 'pageSize': pageSize};

    // 使用 RecommendUserListResponse.fromJson 作为 fromJson 回调
    return await get<RecommendUserListResponse>(
      '/api/v1/data/recommend_user_list',
      queryParameters: queryParams,
      fromJson: RecommendUserListResponse.fromJson, // <--- 修正为正确的 FromJson
      showLoading: showLoading,
    );
  }
}
